﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms
{
    public partial class frmEditarArticulo : Form
    {
        DisancoEntities context;
        int articulo_id;
        Articulos articulo;
        Font fontEditado = new Font("Calibri", 12, FontStyle.Bold);
        Font fontNoEditado = new Font("Calibri", 12, FontStyle.Regular);

        public frmEditarArticulo(int articuloId)
        {
            InitializeComponent();

            articulo_id = articuloId;

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            articulo = context.Articulos.FirstOrDefault(a => a.art_id == articuloId);

            Categorias artCategoria = articulo.Categorias;
            Rubros catRubro = artCategoria.Rubros;

            cmbRubros.ValueMember = "rubro_id";
            cmbRubros.DisplayMember = "rubro_nombre";
            cmbRubros.DataSource = context.Rubros;
            cmbRubros.SelectedItem = catRubro;

            cmbCategorias.ValueMember = "categ_id";
            cmbCategorias.DisplayMember = "categ_nombre";
            cmbCategorias.DataSource = catRubro.Categorias;
            cmbCategorias.SelectedItem = artCategoria;

            txbNombre.Text = articulo.art_nombre;

            dgvProveedores.AutoGenerateColumns = false;

            cargarProveedores();

            cargarOfertas();

            numPrecioLista.Value = articulo.art_precio_lista;
            numPrecioOferta.Value = articulo.art_precio_oferta;
            numStockMinimo.Value = articulo.art_stock_minimo;
            NumUpDowBonific.Value = articulo.art_bonificacion * 100;
            txbStockActual.Text = articulo.art_stock.ToString();
            txbCodigoBarras.Text = articulo.art_codigobarra;
            txbCodigo.Text = articulo.art_codigo;
            
            if (articulo.art_bonif_fecha_ini != null)
            {
                dtpFechaInicioBonif.Value = (DateTime)articulo.art_bonif_fecha_ini;

                dtpFechaInicioBonif.Enabled = true;
                lblBonifFechaIni.Enabled = true;

                chkRangoFechas.Checked = true;
            }
                
            if (articulo.art_bonif_fecha_fin != null)
            {
                dtpFechaFinBonif.Value = (DateTime)articulo.art_bonif_fecha_fin;

                dtpFechaInicioBonif.Enabled = true;
                lblBonifFechaIni.Enabled = true;

                chkRangoFechas.Checked = true;
            }

            if (articulo.art_imagen != null)
                pbImagen.Image = Funcion.byteArrayToImage(articulo.art_imagen);

            dgvOfertas.Sort(oferta_cantidad, ListSortDirection.Ascending);

            //Se asignan los eventos
            this.txbNombre.TextChanged += new System.EventHandler(this.txbNombre_TextChanged);
            this.cmbRubros.SelectedValueChanged += new System.EventHandler(this.cmbRubros_SelectedValueChanged);
            this.cmbCategorias.SelectedIndexChanged += new System.EventHandler(this.cmbCategorias_SelectedIndexChanged);
            this.numPrecioOferta.ValueChanged += new System.EventHandler(this.numPrecioOferta_ValueChanged);
            this.numPrecioLista.ValueChanged += new System.EventHandler(this.numPrecioLista_ValueChanged);
            this.NumUpDowBonific.ValueChanged += new System.EventHandler(this.NumUpDowBonific_ValueChanged);
        }

        private void cargarOfertas()
        {
            foreach (var oferta in articulo.OfertasxArticulo)
            {
                int i = dgvOfertas.Rows.Add();

                dgvOfertas.Rows[i].Cells["oferta_cantidad"].Value = oferta.oferta_cantidad;
                dgvOfertas.Rows[i].Cells["oferta_descuento"].Value = oferta.oferta_descuento;
            }
        }

        private void cargarProveedores()
        {
            //context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            //var articulo = context.Articulos.FirstOrDefault(a => a.art_id == this.articulo_id);
            //dgvProveedores.Rows.Clear();

            foreach (var p in articulo.ProveedoresxArticulos)
            {                
                int i = dgvProveedores.Rows.Add();

                dgvProveedores.Rows[i].Cells["prov_id"].Value = p.prov_id;
                dgvProveedores.Rows[i].Cells["prov_nombre"].Value = p.Proveedores.prov_nombre;
                dgvProveedores.Rows[i].Cells["prov_art_precio"].Value = p.prov_art_precio;
                dgvProveedores.Rows[i].Cells["prov_art_bonif"].Value = p.prov_art_bonif;
                dgvProveedores.Rows[i].Cells["prov_art_precio_bonificado"].Value = p.prov_art_precio_bonificado;
            }
        }

        private bool verificarExistenciaProveedor(int Proveedor)
        {
            foreach (DataGridViewRow fila in dgvProveedores.Rows)
            {
                if ((int)fila.Cells["prov_id"].Value == Proveedor)
                {
                    return true;
                }
            }
            return false;
        }
        
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                DialogResult result = MessageBox.Show("¿Esta seguro de modificar los datos del articulo?", "Confirmación", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);

                if (result == DialogResult.OK)
                {

                    if (txbNombre.Text != "")
                    {
                        Articulos nuevo_articulo = context.Articulos.FirstOrDefault(a => a.art_id == articulo_id);

                        nuevo_articulo.art_nombre = txbNombre.Text;
                        nuevo_articulo.categ_id = (int)cmbCategorias.SelectedValue;

                        nuevo_articulo.ProveedoresxArticulos.Clear();

                        foreach (DataGridViewRow fila in dgvProveedores.Rows)
                        {
                            var proveedor = new ProveedoresxArticulos();

                            proveedor.prov_id = (int)fila.Cells["prov_id"].Value;
                            proveedor.prov_art_precio = (decimal)fila.Cells["prov_art_precio"].Value;
                            proveedor.prov_art_bonif = (decimal)fila.Cells["prov_art_bonif"].Value;

                            nuevo_articulo.ProveedoresxArticulos.Add(proveedor);
                        }

                        nuevo_articulo.OfertasxArticulo.Clear();

                        foreach (DataGridViewRow fila in dgvOfertas.Rows)
                        {
                            var oferta = new OfertasxArticulo();

                            oferta.art_id = this.articulo_id;
                            oferta.oferta_cantidad = (int)fila.Cells["oferta_cantidad"].Value;
                            oferta.oferta_descuento = (decimal)fila.Cells["oferta_descuento"].Value;

                            nuevo_articulo.OfertasxArticulo.Add(oferta);
                        }

                        nuevo_articulo.art_bonificacion = NumUpDowBonific.Value / 100;
                        nuevo_articulo.art_precio_lista = numPrecioLista.Value;
                        nuevo_articulo.art_precio_oferta = numPrecioOferta.Value;
                        nuevo_articulo.art_stock_minimo = Convert.ToInt32(numStockMinimo.Value);
                        nuevo_articulo.art_codigo = txbCodigo.Text;
                        nuevo_articulo.art_codigobarra = txbCodigoBarras.Text;

                        if (pbImagen.Image != null)
                        {
                            nuevo_articulo.art_imagen = Funcion.imageToByteArray(pbImagen.Image, "bmp");
                        }
                        else
                        {
                            nuevo_articulo.art_imagen = null;
                        }

                        if (chkRangoFechas.Checked)
                        {
                            nuevo_articulo.art_bonif_fecha_ini = Convert.ToDateTime(dtpFechaInicioBonif.Value);
                            nuevo_articulo.art_bonif_fecha_fin = Convert.ToDateTime(dtpFechaFinBonif.Value);
                        }
                        else
                        {
                            nuevo_articulo.art_bonif_fecha_ini = null;
                            nuevo_articulo.art_bonif_fecha_fin = null;
                        }

                        context.SaveChanges();

                        MessageBox.Show("Articulo editado correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    else
                    {
                        MessageBox.Show("Debe Ingresar un Nombre para el Articulo");
                    }
                }
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }
        }
      
        

        private void tsbAgregar_Click(object sender, EventArgs e)
        {
            Forms.frmArticuloAgregarProveedor Proveedor = new Forms.frmArticuloAgregarProveedor();
            DialogResult dr = Proveedor.ShowDialog();

            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                if (!verificarExistenciaProveedor(Proveedor.Id))
                {
                    int ind = dgvProveedores.Rows.Add();

                    dgvProveedores.Rows[ind].Cells["prov_id"].Value = Proveedor.Id;
                    dgvProveedores.Rows[ind].Cells["prov_nombre"].Value = Proveedor.Nombre;
                    dgvProveedores.Rows[ind].Cells["prov_art_precio"].Value = Proveedor.Precio;
                    dgvProveedores.Rows[ind].Cells["prov_art_bonif"].Value = Proveedor.Bonificacion;
                    dgvProveedores.Rows[ind].Cells["prov_art_precio_bonificado"].Value = Funcion.PrecioBonificado(Proveedor.Precio, Proveedor.Bonificacion);
                }
                else
                {
                    MessageBox.Show("Ese proveedor ya se encuentra en la lista", "Error:", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void tsbEliminar_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("¿Esta Seguro de Borrar el Proveedor del Articulo?", "Disanco Sanitarios", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);

            if (dr == DialogResult.OK)
            {
                var filasEliminar = dgvProveedores.SelectedRows;

                foreach (DataGridViewRow fila in filasEliminar)
                {
                    dgvProveedores.Rows.Remove(fila);
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void tsbEditar_Click(object sender, EventArgs e)
        {
            DataGridViewRow fila = dgvProveedores.CurrentRow;

            decimal precio = (decimal)fila.Cells["prov_art_precio"].Value;
            decimal bonificacion = (decimal)fila.Cells["prov_art_bonif"].Value;

            frmEditarPrecioArticulo editarPrecio = new frmEditarPrecioArticulo(precio, bonificacion);
            DialogResult dr = editarPrecio.ShowDialog();

            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                fila.Cells["prov_art_precio"].Value = editarPrecio.nuevoPrecio;
                fila.Cells["prov_art_bonif"].Value = editarPrecio.nuevaBonificacion;
                fila.Cells["prov_art_precio_bonificado"].Value = Funcion.PrecioBonificado(precio, bonificacion);
            }
        }

        private void chkRangoFechas_CheckedChanged(object sender, EventArgs e)
        {
            lblBonifFechaIni.Enabled = chkRangoFechas.Checked;
            lblBonifFechaFin.Enabled = chkRangoFechas.Checked;
            dtpFechaFinBonif.Enabled = chkRangoFechas.Checked;
            dtpFechaInicioBonif.Enabled = chkRangoFechas.Checked;

            if (chkRangoFechas.Checked)
            {
                lblBonifFechaIni.Font = this.fontEditado;
                lblBonifFechaFin.Font = this.fontEditado;
                chkRangoFechas.Font = this.fontEditado;
            }
            else
            {
                lblBonifFechaIni.Font = this.fontNoEditado;
                lblBonifFechaFin.Font = this.fontNoEditado;
                chkRangoFechas.Font = this.fontNoEditado;
            }
        }

        private void txbSeleccionarImagen_Click(object sender, EventArgs e)
        {
            DialogResult dr = ofdSeleccionarImagen.ShowDialog();

            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                if (ofdSeleccionarImagen.CheckFileExists)
                {
                    pbImagen.Image = new Bitmap(ofdSeleccionarImagen.FileName);
                }
            }
        }

        private void txbBorrarImagen_Click(object sender, EventArgs e)
        {
            pbImagen.Image = null;
        }

        private void txbNombre_TextChanged(object sender, EventArgs e)
        {
            lblNombre.Font = fontEditado;
        }

        private void cmbRubros_SelectedValueChanged(object sender, EventArgs e)
        {
            lblRubro.Font = this.fontEditado;
            cmbCategorias.DataSource = ((Rubros)cmbRubros.SelectedItem).Categorias;
        }

        private void cmbCategorias_SelectedIndexChanged(object sender, EventArgs e)
        {
            lblCateg.Font = this.fontEditado;
        }

        private void numPrecioOferta_ValueChanged(object sender, EventArgs e)
        {
            lblPrecioOferta.Font = this.fontEditado;
        }

        private void numPrecioLista_ValueChanged(object sender, EventArgs e)
        {
            lblPrecioLista.Font = this.fontEditado;
        }

        private void NumUpDowBonific_ValueChanged(object sender, EventArgs e)
        {
            lblBonif.Font = this.fontEditado;
        }

        private void tsbAgregarOferta_Click(object sender, EventArgs e)
        {
            GestionArticulos.frmAgregarOferta oferta = new GestionArticulos.frmAgregarOferta();
            DialogResult dr = oferta.ShowDialog();

            if (dr == System.Windows.Forms.DialogResult.OK)
            {

                int i = dgvOfertas.Rows.Add();

                dgvOfertas.Rows[i].Cells["oferta_cantidad"].Value = oferta.Cantidad;
                dgvOfertas.Rows[i].Cells["oferta_descuento"].Value = oferta.Descuento;

                dgvOfertas.Sort(oferta_cantidad, ListSortDirection.Ascending);
            }
        }

        private void tsbEditarOferta_Click(object sender, EventArgs e)
        {
            if (dgvOfertas.CurrentRow != null)
            {
                int cantidad_actual = (int)dgvOfertas.CurrentRow.Cells["oferta_cantidad"].Value;
                decimal descuento_actual = (decimal)dgvOfertas.CurrentRow.Cells["oferta_descuento"].Value;

                GestionArticulos.frmAgregarOferta oferta = new GestionArticulos.frmAgregarOferta(cantidad_actual, descuento_actual);
                DialogResult dr = oferta.ShowDialog();

                if (dr == System.Windows.Forms.DialogResult.OK)
                {
                    dgvOfertas.CurrentRow.Cells["oferta_cantidad"].Value = oferta.Cantidad;
                    dgvOfertas.CurrentRow.Cells["oferta_descuento"].Value = oferta.Descuento;

                    dgvOfertas.Sort(oferta_cantidad, ListSortDirection.Ascending);
                }
            }
        }

        private void txbEliminarOferta_Click(object sender, EventArgs e)
        {
            if (dgvOfertas.CurrentRow != null)
            {
                DialogResult dr = MessageBox.Show("¿Seguro que desea eliminar esta oferta?", "Confirmación", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (dr == DialogResult.Yes)
                {
                    dgvOfertas.Rows.Remove(dgvOfertas.CurrentRow);
                }
            }
        }
    }
}
